package com.smart.community.property.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.smart.community.commons.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 卫生费实体类
 * 
 * <p>卫生费是物业管理中的重要费用类型，用于维护社区环境卫生。
 * 包括垃圾清运、环境清洁、卫生设施维护等费用。</p>
 * 
 * <p>Entity规范要求：</p>
 * <ul>
 *   <li>只负责数据库字段映射，不包含业务逻辑</li>
 *   <li>继承BaseEntity获得标准字段</li>
 *   <li>枚举字段使用String类型存储</li>
 *   <li>字段类型与数据库表结构完全一致</li>
 * </ul>
 * 
 * @author Wu.Liang
 * @since 2024-12-21
 * @version 2.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sc_sanitation_fee")
@Schema(description = "卫生费实体")
public class SanitationFee extends BaseEntity {
    private static final long serialVersionUID = 8015815274162670956L;

    /**
     * 费用编号
     * 
     * <p>卫生费的唯一标识编号，用于费用查询和管理。
     * 格式：SF + 年月 + 6位序号，如：SF202401000001</p>
     */
    @Schema(description = "费用编号")
    @TableField("fee_no")
    private String feeNo;

    /**
     * 用户ID
     * 
     * <p>缴费用户的唯一标识，关联用户表。</p>
     */
    @Schema(description = "用户ID")
    @NotNull(message = "用户ID不能为空")
    @TableField("user_id")
    private Long userId;

    /**
     * 社区ID
     * 
     * <p>所属社区的唯一标识，关联社区表。</p>
     */
    @Schema(description = "社区ID")
    @NotNull(message = "社区ID不能为空")
    @TableField("community_id")
    private Long communityId;

    /**
     * 楼栋ID
     * 
     * <p>所属楼栋的唯一标识，关联楼栋表。</p>
     */
    @Schema(description = "楼栋ID")
    @TableField("building_id")
    private Long buildingId;

    /**
     * 单元ID
     * 
     * <p>所属单元的唯一标识，关联单元表。</p>
     */
    @Schema(description = "单元ID")
    @TableField("unit_id")
    private Long unitId;

    /**
     * 房户ID
     * 
     * <p>所属房户的唯一标识，关联房户表。</p>
     */
    @Schema(description = "房户ID")
    @NotNull(message = "房户ID不能为空")
    @TableField("household_id")
    private Long householdId;

    /**
     * 居民ID
     * 
     * <p>居民的唯一标识，关联居民表。</p>
     */
    @Schema(description = "居民ID")
    @TableField("resident_id")
    private Long residentId;

    /**
     * 费用类型
     * 
     * <p>费用类型，使用Integer类型存储枚举值。</p>
     */
    @Schema(description = "费用类型")
    @TableField("fee_type")
    private Integer feeType;

    /**
     * 计费月份
     * 
     * <p>卫生费的计费月份，如：2024-01、2024-08 ~ 2024-11等。</p>
     */
    @Schema(description = "计费月份")
    @TableField("fee_month")
    private String feeMonth;

    /**
     * 计费周期
     * 
     * <p>卫生费的计费周期，如：2024年1月、2024年第一季度等。</p>
     */
    @Schema(description = "计费周期")
    @TableField("billing_period")
    private String billingPeriod;

    /**
     * 费用金额
     * 
     * <p>卫生费的总金额，单位为元，精确到分。</p>
     */
    @Schema(description = "费用金额")
    @NotNull(message = "费用金额不能为空")
    @DecimalMin(value = "0.01", message = "费用金额必须大于0")
    @TableField("amount")
    private BigDecimal amount;

    /**
     * 到期日期
     * 
     * <p>卫生费的缴费截止日期，超过此日期将产生滞纳金。</p>
     */
    @Schema(description = "到期日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField("due_date")
    private LocalDate dueDate;

    /**
     * 支付状态
     * 
     * <p>卫生费的支付状态，使用Integer类型存储枚举值：
     * - 1: 已支付
     * - 0: 未支付
     * - 2: 逾期</p>
     */
    @Schema(description = "支付状态：0-未支付，1-已支付，2-逾期")
    @TableField("payment_status")
    private Integer paymentStatus;

    /**
     * 已支付金额
     * 
     * <p>用户已支付的金额，单位为元，精确到分。
     * 可能小于总金额，表示部分支付。</p>
     */
    @Schema(description = "已支付金额")
    @TableField("payment_amount")
    private BigDecimal paymentAmount;

    /**
     * 未支付金额
     * 
     * <p>未支付的金额，使用BigDecimal类型确保精度。</p>
     */
    @Schema(description = "未支付金额")
    @TableField("unpaid_amount")
    private BigDecimal unpaidAmount;

    /**
     * 支付时间
     * 
     * <p>用户支付卫生费的时间，精确到秒。</p>
     */
    @Schema(description = "支付时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("payment_time")
    private LocalDateTime paymentTime;

    /**
     * 支付方式
     * 
     * <p>用户支付卫生费的方式，如：微信支付、支付宝、银行转账等。</p>
     */
    @Schema(description = "支付方式")
    @TableField("payment_method")
    private String paymentMethod;

    /**
     * 在线支付ID
     * 
     * <p>在线支付平台的交易ID，用于支付记录查询。</p>
     */
    @Schema(description = "在线支付ID")
    @TableField("online_payment_id")
    private String onlinePaymentId;

    /**
     * 单价
     * 
     * <p>按面积计费时的单价，单位为元/平方米。</p>
     */
    @Schema(description = "单价")
    @TableField("unit_price")
    private BigDecimal unitPrice;

    /**
     * 面积
     * 
     * <p>房屋面积，单位为平方米。</p>
     */
    @Schema(description = "面积")
    @TableField("area")
    private BigDecimal area;

    /**
     * 发票号
     * 
     * <p>发票号码，用于财务记录。</p>
     */
    @Schema(description = "发票号")
    @TableField("invoice_no")
    private String invoiceNo;

    /**
     * 状态
     * 
     * <p>记录状态，使用Integer类型存储枚举值：
     * - 1: 启用
     * - 0: 禁用</p>
     */
    @Schema(description = "状态：0-禁用，1-启用")
    @TableField("status")
    private Integer status;

    /**
     * 备注
     * 
     * <p>卫生费的备注信息。</p>
     */
    @Schema(description = "备注")
    @TableField("remark")
    private String remark;
}
